# ============================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name: CMakeLists.txt
# * Author   : 苏木
# * Date     : 2025-05-22
# * Version  : 
# * Description: cmake version 3.16.3
# ============================================================
## https://cmake.com.cn/cmake/help/latest/guide/tutorial/index.html
## https://cmake.org/cmake/help/latest/

# 指定 CMake 的最低版本要求
# --------------------------------------------------
cmake_minimum_required(VERSION 3.10)


# 设置项目名称和使用的编程语言
# --------------------------------------------------
project(SPROJECT C)
set(app_target "app_demo.out")

# 启用/禁用在生成期间输出编译命令。会生成compile_commands.json文件,包含编译命令，可以被clangd使用实现跳转和补全
# --------------------------------------------------
# 注意,这个选项放在PROJECT之前的话可能导致第一次构建不生效
# SET(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "Enable compile commands export" FORCE) # 强制设置变量并更新缓存
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)


# 设置C编译器
# --------------------------------------------------
# set(CMAKE_C_COMPILER "/home/sumu/2software/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_C_COMPILER "gcc")
message(STATUS "[USER:TOP]CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") # c编译器，一般默认是gcc


# 设置C编译选项,要放在 add_executable 之前
# --------------------------------------------------
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
add_compile_options(-g -Wall) # 不会去修改 CMAKE_C_FLAGS，一般还是建议用这个


# 指定可执行程序和源文件
# --------------------------------------------------
set(src_list main.c)                        # 设置main函数源文件
file(GLOB func_src_list "func_version/*.c") # 自动扫描func_version目录下的所有c文件
list(APPEND src_list ${func_src_list})      # 将 func_src_list 追加到 src_list

include_directories(func_version)           # 添加头文件目录
add_executable(${app_target} ${src_list})


# 获取目标的属性,要先指定目标才能获取
# --------------------------------------------------
get_target_property(app_compile_options app_demo.out COMPILE_OPTIONS) # 获取编译选项属性
message(STATUS "[USER:TOP]Target Compile Options: ${app_compile_options}")
message(STATUS "[USER:TOP]CMAKE_C_FLAGS         : ${CMAKE_C_FLAGS}")      # c编译选项


# 源目录和构建目录
# --------------------------------------------------
# 在CMake处理每个文件时，将自动更新以下只读变量。它们总是以绝对路径显示
message(STATUS "[USER:TOP]CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}") # 源的最顶层目录(即最顶层CMakeLists.txt文件所在的位置)。这个变量永远不会变。
message(STATUS "[USER:TOP]CMAKE_BINARY_DIR : ${CMAKE_BINARY_DIR}") # 构建的最顶层目录。这个变量永远不会改变。
message(STATUS "[USER:TOP]CMAKE_CURRENT_SOURCE_DIR : ${CMAKE_CURRENT_SOURCE_DIR}") # 当前处理的CMakeLists.txt文件的目录。通过add_subdirectory()处理新文件时更新。
message(STATUS "[USER:TOP]CMAKE_CURRENT_BINARY_DIR : ${CMAKE_CURRENT_BINARY_DIR}") # 当前处理的CMakeLists.txt文件对应的构建目录。每次调用add_subdirectory()时进行更新。

add_subdirectory(func_version) # 添加子目录

message(STATUS "[USER:TOP]CMAKE_CURRENT_SOURCE_DIR : ${CMAKE_CURRENT_SOURCE_DIR}") # 当前处理的CMakeLists.txt文件的目录。通过add_subdirectory()处理新文件时更新。
message(STATUS "[USER:TOP]CMAKE_CURRENT_BINARY_DIR : ${CMAKE_CURRENT_BINARY_DIR}") # 当前处理的CMakeLists.txt文件对应的构建目录。每次调用add_subdirectory()时进行更新。

